package freespiritsocial.io.user.network

import freespiritsocial.io.user.R
import freespiritsocial.io.user.data.location.GoogleLocationBean
import freespiritsocial.io.user.data.model.bean.*
import me.hgj.jetpackmvvm.base.appContext
import okhttp3.MultipartBody
import retrofit2.Response
import retrofit2.http.*

/**
 * 描述　: 网络API
 */
interface ApiService {

    companion object {
        const val PAGE_SIZE = 21
    }

    @Multipart
    @POST("/upload/uploadFile")
    suspend fun uploadFile(
        @Part file: MultipartBody.Part
    ): ApiResponse<UploadPojo?>

    @Multipart
    @POST("/upload/multipartFiles")
    suspend fun multipartFiles(
        @Part files: List<MultipartBody.Part>
//        @Body files: RequestBody
    ): ApiResponse<List<String>?>

    @GET("/app/version")
    suspend fun checkVersion(@Query("versionCode") versionCode: String): ApiResponse<UpdateBean>

    //=====================账号相关============================
    /**
     * firebase,登陆后上传firebase
     */
    @POST("/app/user/firebase")
    suspend fun firebase(
        @Body map: HashMap<String,String>
    ): ApiResponse<Any?>

    /**
     * 登录
     */
    @POST("/app/user/login")
    suspend fun login(
        @Body map: HashMap<String,String>
    ): Response<ApiResponse<Any?>>

    @POST("/app/user/login/third-party")
    suspend fun signInByThird(
        @Body map: HashMap<String,@JvmSuppressWildcards Any>
    ): Response<ApiResponse<Any?>>

    @POST("/app/user/match-registered")
    suspend fun findFriend(
        @Body ids: List<String>
    ): ApiResponse<List<DiscoverFriendPojo>>

    /**
     * @param userId 不传代表自己
     */
    @GET("/app/user/info")
    suspend fun getUserInfo(
        @Query("userId") userId: String? = null
    ): ApiResponse<UserInfo>

    /**
     * 发送短信
     * areaCode	带+号的区号
     * mobile	手机号码
     * type	短信类型（0：登录，1：注册，2：忘记密码）
     */
    @POST("/app/user/sendSmsCode")
    suspend fun sendSmsCode(
        @Body map: HashMap<String,@JvmSuppressWildcards Any>
    ): ApiResponse<String?>

    /**
     * 检查短信是否过期
     * areaCode	带+号的区号
     * mobile	手机号码
     * type	短信类型（0：登录，1：注册，2：忘记密码）
     */
    @POST("/app/user/checkSmsCode")
    suspend fun checkSmsCode(
        @Body map: HashMap<String,@JvmSuppressWildcards Any>
    ): ApiResponse<String?>

    /**
     * 注册
    areaCode	带+号的区号
    string
    birthday	生日（yyyy-MM-dd格式字符串）
    string
    code	短信验证码
    string
    country	国家
    string
    name	真实姓名
    string
    password	MD5加密后的密码
    string
    userAvatar	用户头像
    string
    userEmail	用户邮箱
    string
    userMobile	手机号码
    string
    userName	用户姓名
    string
    userSex	性别（0：未知，1：男，2：女）
     */
    @POST("/app/user/register")
    suspend fun register(
        @Body map: HashMap<String,@JvmSuppressWildcards Any>
    ): ApiResponse<String?>

    @POST("/app/user/register/third-party")
    suspend fun registerThird(
        @Body map: HashMap<String,@JvmSuppressWildcards Any>
    ): Response<ApiResponse<Any?>>

    /**
     * 检查手机号是否被注册
     * areaCode	带+号的区号
     * mobile	手机号码
     */
    @GET("/app/user/checkMobile/{areaCode}/{mobile}")
    suspend fun checkMobile(
        @Path("areaCode") areaCode: String,
        @Path("mobile") mobile: String,
    ): ApiResponse<String?>


    /**
     * 忘记密码
     * areaCode	带+号的区号
     * mobile	手机号码
     */
    @PUT("/app/user/forgetPassword")
    suspend fun forgetPassword(
        @Body map: HashMap<String,@JvmSuppressWildcards Any>
    ): ApiResponse<String?>

    @PUT("/app/user/info")
    suspend fun updateUserInfo(
        @Body user: UserInfo
    ): ApiResponse<Any?>

    @PUT("/app/user/updatePassword/{password}")
    suspend fun updatePassword(
        @Path("password") password: String
    ): ApiResponse<Any?>

    @POST("/app/user/logout")
    suspend fun logout(): ApiResponse<Any?>

    //=====================首页相关============================

    /**
     * 首页中所有帖子列表，会随机插入广告贴
     * tagName     标签Id
     * postId	查询第一页不用传，查询下一页需要把上一页结果中的postId传过来
     * advertisingId	查询第一页不用传，查询下一页需要把上一页结果中的advertisingId传过来
     */
    @GET("/invitation/all-list")
    suspend fun getExploreList(
        @Query("tagName") tagName: String?,
        @Query("postId") postId: Long?,
        @Query("advertisingId") advertisingId: Long?,
    ): ApiResponse<PostList>

    /**
     * 首页中查询标签列表
     */
    @GET("/invitation/tag-list")
    suspend fun getTagList(): ApiResponse<List<TagPojo>>

    /**
     * 首页Following页面中查询所有关注了的用户发布的帖子
     */
    @GET("/invitation/all-following-list")
    suspend fun getFollowingPostList(
        @Query("postId") postId: Long?
    ): ApiResponse<List<PostPojo>>

    /**
     * 我关注的用户列表，首页中Following页面也使用这个接口
     */
    @GET("/app/user/attention/list")
    suspend fun getFollowingList(): ApiResponse<List<UserInfo>>

    //=====================搜索相关============================

    /**
     * 搜索记录
     */
    @PUT("/invitation/getSearchHistoryList")
    suspend fun getSearchHistoryList(): ApiResponse<List<HistoryResultPojo>>

    /**
     * 删除历史记录
     */
    @PUT("/invitation/deleteSearchHistory/{id}")
    suspend fun deleteSearchHistory(@Path("id") id: Long): ApiResponse<Any?>

    /**
     * 添加历史记录
     */
    @PUT("/invitation/addSearchHistory")
    suspend fun addSearchHistory(@Body map: HashMap<String,String>): ApiResponse<Any?>

    /**
     * 根据关键字搜索ForYou列表
     */
    @PUT("/invitation/getForYouResults")
    suspend fun getForYouResults(@Body map: HashMap<String,String>): ApiResponse<ForYouSearchPojo>

    /**
     * 查询其他三个种类的搜索列表
     */
    @PUT("/invitation/getSearchList")
    suspend fun getSearchList(@Body map: HashMap<String,@JvmSuppressWildcards Any?>): ApiResponse<List<SearchPojo>>

    /**
     * 搜索列表-横向加载更多数据
     */
    @PUT("/invitation/invitationList")
    suspend fun loadMoreSearchItemList(@Body map: HashMap<String,@JvmSuppressWildcards Any?>): ApiResponse<List<Invitation>>

    //=====================帖子相关============================

    /**
     * 帖子详情
     * @param invitationId Long? 帖子id
     * @return ApiResponse<PostPojo> see[PostPojo]
     */
    @PUT("/invitation/getInvitationDetail/{invitationId}")
    suspend fun getInvitationDetail(@Path("invitationId") invitationId: Long?): ApiResponse<PostPojo>

    /**
     * 保存帖子
     */
    @PUT("/invitation/saveInvitation/{invitationId}")
    suspend fun saveInvitation(@Path("invitationId") invitationId: Long?): ApiResponse<Any?>

    /**
     * 删除帖子
     */
    @PUT("/invitation/deleteInvitation/{invitationId}")
    suspend fun deleteInvitation(@Path("invitationId") invitationId: Long?): ApiResponse<Any?>

    /**
     * 隐藏帖子
     */
    @PUT("/invitation/hideInvitation/{invitationId}")
    suspend fun hideInvitation(@Path("invitationId") invitationId: Long?): ApiResponse<Any?>

    /**
     * 点赞帖子
     */
    @PUT("/invitation/like/{id}/1")
    suspend fun likePost(@Path("id") id: Long?): ApiResponse<Any?>

    /**
     * 举报
     */
    @PUT("/invitation/reportInvitation/{invitationId}/{type}")
    suspend fun reportInvitation(@Path("invitationId") id: Long?,@Path("type") type: Int): ApiResponse<Any?>

    /**
     * 点赞评论
     */
    @PUT("/invitation/like/{id}/2")
    suspend fun likeComment(@Path("id") id: Long?): ApiResponse<Any?>

    /**
     * 获取评论列表
     * invitationId	帖子id
     * lastCommentId	最后一条评论Id,第一次传null
     */
    @PUT("/invitation/getComments")
    suspend fun getComments(@Body map: HashMap<String,@JvmSuppressWildcards Any?>): ApiResponse<List<CommentPojo>>

    /**
     * 评论
     * commentId    回复评论的评论id
     * content  评论内容
     * invitationId 帖子id
     */
    @PUT("/invitation/comment")
    suspend fun comment(@Body map: HashMap<String,@JvmSuppressWildcards Any?>): ApiResponse<Any?>

    /**
     * 搜索tag
     * @param keyword 关键字
     * @return tag列表
     */
    @PUT("/invitation/getTagList")
    suspend fun getTagList(@Body keyword: HashMap<String,@JvmSuppressWildcards Any?>): ApiResponse<List<freespiritsocial.io.user.data.model.bean.Tag>?>

    /**
     * 获取所有有帖子的地区
     * @return ApiResponse<List<PostLocationPojo>?>
     */
    @GET("/invitation/coordinate")
    suspend fun coordinate(): ApiResponse<List<PostLocationPojo>?>

    /**
     * 获取该地区的帖子
     * @param area String 地区
     * @return ApiResponse<List<PostPojo>>
     */
    @GET("/invitation/area-list")
    suspend fun getAreaPostList(@Query("area") area: String): ApiResponse<List<PostPojo>>

    /**
     * 发布帖子
     */
    @PUT("/invitation/publish")
    suspend fun publishPost(@Body post: PostPojo): ApiResponse<Any?>

    /**
     * 修改帖子
     */
    @PUT("/invitation/updateInvitation")
    suspend fun updateInvitation(@Body post: PostPojo): ApiResponse<Any?>

    //=======================用户相关===========================

    /**
     * 删除账号
     * @return ApiResponse<Any?>
     */
    @DELETE("/app/user/delete")
    suspend fun deleteAccount(): ApiResponse<Any?>

    /**
     * 更新对某个用户的关注状态
     * @param beAttentionId String? 被关注的用户ID
     * @param status Int 1：关注，2：不关注
     * @return ApiResponse<Any?>
     */
    @PUT("/app/user/attention")
    suspend fun attention(@Query("beAttentionId") beAttentionId: String?,@Query("status") status: Int): ApiResponse<Any?>

    /**
     * 查询自己或者某个用户的帖子列表
     * @param queryType 查询帖子类别（1：发布的帖子，2：有标签的帖子，3：已保存的帖子--只能查询自己的已保存的帖子）
     * @param boundaryValue 查询第一页不用传，查询下一页需要把上一页结果中的boundaryValue传过来
     * @param userId 用户ID，不传或传null则查询自己的帖子列表
     */
    @GET("/invitation/query")
    suspend fun getUserPostList(
        @Query("queryType") queryType: Int,
        @Query("boundaryValue") boundaryValue: Long? = null,
        @Query("userId") userId: String? = null
    ): ApiResponse<PostList?>

    @GET("/app/user/fan/list")
    suspend fun getMyFanList(): ApiResponse<List<UserInfo>>

    @POST("/app/user/contactUs")
    suspend fun contactUs(@Body keyword: HashMap<String,@JvmSuppressWildcards String>): ApiResponse<Any?>

    @GET("/app/user/chatReportTopic")
    suspend fun chatReportTopic(): ApiResponse<List<String>>

    @POST("/app/user/chatReport")
    suspend fun chatReport(@Body keyword: HashMap<String,@JvmSuppressWildcards String>): ApiResponse<Any?>

    //=======================通知相关===========================

    /**
     * 获取用户通知设置
     * @return ApiResponse<NotificationPojo>
     */
    @GET("/app/user/push/getNotificationSetting")
    suspend fun getNotificationSetting(): ApiResponse<NotificationSettingPojo?>

    /**
     * 查询通知列表
     * @return ApiResponse<List<NotificationPojo>>
     */
    @POST("/app/user/push/getPushInfoList")
    suspend fun getPushInfoList(@Query("lastPushId") lastPushId: Long?): ApiResponse<List<NotificationPojo>>

    @POST("/app/user/push/clearAllPush")
    suspend fun clearAllPush(): ApiResponse<Any?>

    /**
     * 消息设置为已读
     * @param pushIds String 消息id，多个用逗号隔开
     * @return ApiResponse<Any?>
     */
    @POST("/app/user/push/pushRead")
    suspend fun pushRead(@Query("pushIds") pushIds: String): ApiResponse<Any?>

    /**
     *
     * @param map HashMap<String, [@kotlin.jvm.JvmSuppressWildcards] Any>
     * commentsOnOff	评论通知开关
     * likeOnOff	点赞通知开关 1.开 0.关
     * storiesOnOff	发表新帖子通知开关
     * @return ApiResponse<Any?>
     */
    @POST("/app/user/push/notificationSetting")
    suspend fun setNotificationSetting(@Body map: HashMap<String,@JvmSuppressWildcards Any?>): ApiResponse<Any?>

    //======================== location API ========================

    @GET
    suspend fun getLocationByLatLng(
        @Url url: String = "https://maps.googleapis.com/maps/api/geocode/json?key=${appContext.getString(R.string.google_api_key)}",
        @Query("latlng") latlng: String
    ): GoogleLocationBean

    @GET
    suspend fun locationTextSearch(
        @Url url: String = "https://maps.googleapis.com/maps/api/place/textsearch/json?key=${appContext.getString(R.string.google_api_key)}",
        @Query("query") query: String
    ): GoogleLocationBean

    @GET
    suspend fun nearbySearch(
        @Url url: String = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?language=en-AU&key=${appContext.getString(R.string.google_api_key)}",
        @Query("location") location: String,
        @Query("radius") radius: Int = 1000,
    ): GoogleLocationBean

}